import pygame
from settings import *
from timer import Timer

class Menu:
	def __init__(self, player, toggle_menu):
		# 一般设置
		self.player = player  # 玩家对象
		self.toggle_menu = toggle_menu  # 切换菜单状态的函数
		self.display_surface = pygame.display.get_surface()  # 显示表面
		self.font = pygame.font.Font('../font/LycheeSoda.ttf', 30)  # 字体

		# 选项设置
		self.width = 400  # 菜单宽度
		self.space = 10  # 选项之间的间距
		self.padding = 8  # 选项内边距

		# 选项内容
		self.options = list(self.player.item_inventory.keys()) + list(self.player.seed_inventory.keys())  # 选项列表，包括物品和种子
		self.sell_border = len(self.player.item_inventory) - 1  # 标记卖出边界的索引
		self.setup()  # 初始化设置

		# 移动
		self.index = 0  # 当前选项的索引
		self.timer = Timer(200)  # 定时器

	def display_money(self):
		text_surf = self.font.render(f'${self.player.money}', False, 'Black')  # 渲染显示金钱的文本表面
		text_rect = text_surf.get_rect(midbottom=(SCREEN_WIDTH / 2, SCREEN_HEIGHT - 20))  # 金钱文本的位置矩形

		pygame.draw.rect(self.display_surface, 'White', text_rect.inflate(10, 10), 0, 4)  # 绘制金钱文本的背景矩形
		self.display_surface.blit(text_surf, text_rect)  # 在显示表面上绘制金钱文本

	def setup(self):
		# 创建文本表面
		self.text_surfs = []  # 文本表面列表
		self.total_height = 0  # 菜单的总高度

		for item in self.options:
			text_surf = self.font.render(item, False, 'Black')  # 渲染选项文本的表面
			self.text_surfs.append(text_surf)  # 将文本表面添加到列表中
			self.total_height += text_surf.get_height() + (self.padding * 2)  # 更新菜单的总高度

		self.total_height += (len(self.text_surfs) - 1) * self.space  # 加上选项之间的间距
		self.menu_top = SCREEN_HEIGHT / 2 - self.total_height / 2  # 菜单的顶部位置
		self.main_rect = pygame.Rect(SCREEN_WIDTH / 2 - self.width / 2, self.menu_top, self.width,
		                             self.total_height)  # 菜单的矩形区域

		# "买入/卖出"文本表面
		self.buy_text = self.font.render('buy', False, 'Black')  # "买入"文本表面
		self.sell_text = self.font.render('sell', False, 'Black')  # "卖出"文本表面

	def input(self):
		keys = pygame.key.get_pressed()  # 获取按键状态
		self.timer.update()  # 更新定时器状态

		if keys[pygame.K_ESCAPE]:  # 按下 ESC 键时切换菜单状态
			self.toggle_menu()

		if not self.timer.active:
			if keys[pygame.K_UP]:  # 按下上箭头键时向上移动选项
				self.index -= 1
				self.timer.activate()

			if keys[pygame.K_DOWN]:  # 按下下箭头键时向下移动选项
				self.index += 1
				self.timer.activate()

			if keys[pygame.K_SPACE]:  # 按下空格键时执行选中选项的操作
				self.timer.activate()

				# 获取当前选项
				current_item = self.options[self.index]

				# 卖出选项
				if self.index <= self.sell_border:
					if self.player.item_inventory[current_item] > 0:  # 如果物品库存大于0
						self.player.item_inventory[current_item] -= 1  # 减少物品库存
						self.player.money += SALE_PRICES[current_item]  # 增加金钱

				# 买入选项
				else:
					seed_price = PURCHASE_PRICES[current_item]  # 种子的价格
					if self.player.money >= seed_price:  # 如果玩家金钱足够支付
						self.player.seed_inventory[current_item] += 1  # 增加种子库存
						self.player.money -= PURCHASE_PRICES[current_item]  # 减少金钱

		# 限制索引的范围
		if self.index < 0:
			self.index = len(self.options) - 1
		if self.index > len(self.options) - 1:
			self.index = 0

	def show_entry(self, text_surf, amount, top, selected):
		# 背景
		bg_rect = pygame.Rect(self.main_rect.left, top, self.width,
		                      text_surf.get_height() + (self.padding * 2))  # 背景矩形
		pygame.draw.rect(self.display_surface, 'White', bg_rect, 0, 4)  # 绘制背景矩形

		# 文本
		text_rect = text_surf.get_rect(midleft=(self.main_rect.left + 20, bg_rect.centery))  # 文本的位置矩形
		self.display_surface.blit(text_surf, text_rect)  # 在显示表面上绘制文本

		# 数量
		amount_surf = self.font.render(str(amount), False, 'Black')  # 渲染数量文本的表面
		amount_rect = amount_surf.get_rect(midright=(self.main_rect.right - 20, bg_rect.centery))  # 数量文本的位置矩形
		self.display_surface.blit(amount_surf, amount_rect)  # 在显示表面上绘制数量文本

		# 选中状态
		if selected:
			pygame.draw.rect(self.display_surface, 'black', bg_rect, 4, 4)  # 绘制选中项的边框矩形
			if self.index <= self.sell_border:  # 卖出
				pos_rect = self.sell_text.get_rect(midleft=(self.main_rect.left + 150, bg_rect.centery))  # "卖出"文本的位置矩形
				self.display_surface.blit(self.sell_text, pos_rect)  # 在显示表面上绘制"卖出"文本
			else:  # 买入
				pos_rect = self.buy_text.get_rect(midleft=(self.main_rect.left + 150, bg_rect.centery))  # "买入"文本的位置矩形
				self.display_surface.blit(self.buy_text, pos_rect)  # 在显示表面上绘制"买入"文本

	def update(self):
		self.input()  # 处理输入
		self.display_money()  # 显示金钱

		for text_index, text_surf in enumerate(self.text_surfs):
			top = self.main_rect.top + text_index * (text_surf.get_height() + (self.padding * 2) + self.space)  # 选项的顶部位置
			amount_list = list(self.player.item_inventory.values()) + list(self.player.seed_inventory.values())  # 物品和种子库存列表
			amount = amount_list[text_index]  # 当前选项的数量
			self.show_entry(text_surf, amount, top, self.index == text_index)  # 显示选项及其相关信息
